package com.zmn.oms.third.zhimi.service;

import com.zmn.oms.common.dto.ResultDTO;
import com.zmn.oms.common.exception.OmsBaseException;
import com.zmn.oms.common.vo.KVDict;
import com.zmn.oms.third.zhimi.api.ZhimiExpressResp;
import com.zmn.oms.third.zhimi.dto.CheckResultDTO;
import com.zmn.oms.third.zhimi.dto.SaveBuyDateResulstDTO;
import com.zmn.oms.third.zhimi.entity.ZhimiOrderExtend;

import java.util.Date;
import java.util.List;

/**
 * 类描述：
 *
 * @author lhl
 * @date 2020/04/24 22:23
 */
public interface ZhimiOrderExtendService {

    /**
     * 检查智米订单数据是否完整，能都操作完成
     * @return
     */
    ResultDTO check4Complete(Long orderId);

    /**
     * 判断是否用料 0:不需要  1:需要
     * @param faults
     * @param thirdModelCode
     * @return
     */
    int useParts(List<ZhimiOrderExtend.Fault> faults, String thirdModelCode);

    /**
     * 通过啄木鸟订单ID查询智米订单的附加信息
     * @param orderId
     * @return
     */
    ZhimiOrderExtend findZhimiOrderExtendByOrderId(Long orderId);

    /**
     * 查询ZhimiOrderExtend信息
     * @param orderId
     * @param containsExtendData 返回对象中是否需要包含extendData属性的值
     * @return
     */
    ZhimiOrderExtend findZhimiOrderExtend(Long orderId, boolean containsExtendData);

    /**
     * 保存智米订单附加信息，该方法要求参数的orderId、serviceType属性不能为空，否则会抛出OmsBaseException.
     * @param zhimiOrderExtend
     * @throws OmsBaseException
     */
    void saveZhimiOrderExtend(ZhimiOrderExtend zhimiOrderExtend) throws OmsBaseException;

    /**
     * 保存勘测结果，检测结果，换机结果，退机结果
     * @param zhimiOrderExtend
     * @return
     */
    ResultDTO saveZhimiOrderExtendLocalInfo(ZhimiOrderExtend zhimiOrderExtend);

    /**
     * 校验sn号是否有效，如果失败，返回相关信息
     * @param orderId
     * @param sn
     * @param thirdModelCode 三级机型编码，sn传"800000"时必填，其他传null即可
     * @return
     */
    CheckResultDTO checkSNCode(Long orderId, String sn, String thirdModelCode);

    /**
     * 校验sn号是否有效，如果失败，返回相关信息
     * @param orderId
     * @param newSn 换机操作时有值，其他传null即可
     * @return
     */
    CheckResultDTO checkNewSNCode(Long orderId, String newSn);

    /**
     * 获取可选择的故障列表
     * @return
     */
    List<KVDict<String>> getFaultList(Long orderId);

    /**
     * 保存故障信息
     * @param zhimiOrderExtend
     *  zhimiOrderExtend实列的 orderId, faults 两个属性不能为空
     */
    ResultDTO saveOrderFaults(ZhimiOrderExtend zhimiOrderExtend);

    /**
     * 获取可选择的配件列表
     *  返回值为 ZhimiOrderExtend 对象，里边包含三个属性：orderId, parts, postAddress;
     * @return
     */
    ZhimiOrderExtend getPartList(Long orderId);

    /**
     * 保存配件信息
     * @param zhimiOrderExtend
     *  zhimiOrderExtend实列的 orderId, parts, postAddress 三个属性不能为空
     */
    ResultDTO saveOrderParts(ZhimiOrderExtend zhimiOrderExtend);

    /**
     * 获取已申请的配件列表
     * @return
     */
    List<ZhimiOrderExtend.Part> getAppliedPartList(Long orderId);

    /**
     * 获取已申请的配件的邮寄信息
     * @param zhimiOrderExtend
     * @return
     */
    ZhimiExpressResp pullAppliedPartExpress(ZhimiOrderExtend zhimiOrderExtend);

    /**
     * 保存购机日期，当订单是保外单时调用有效。
     *  该方法用于人工修正订单是否在保修期内，当订单不在保修期时，同过传入发票的购机日期，重新判断产品是否在保修期
     * @param zhimiOrderExtend
     *  zhimiOrderExtend实列的 orderId, buyDate 两个属性不能为空
     */
    ResultDTO<SaveBuyDateResulstDTO> saveBuyDate(ZhimiOrderExtend zhimiOrderExtend);

    /**
     * 保存返厂物流信息
     * @param zhimiOrderExtend zhimiOrderExtend实列的 orderId, returnFactoryExpress 两个属性不能为空
     * @return
     */
    ResultDTO saveReturnFactoryExpress(ZhimiOrderExtend zhimiOrderExtend);

    /**
     * 修改智米订单服务类型
     * @param orderId
     * @param serviceType
     * @return
     */
    ResultDTO updateServiceType(Long orderId, Integer serviceType);

    /**
     * 更新智米的故障项字典数据
     * @return
     */
    ResultDTO refreshZhimiFaults();

    /**
     * 更新智米的配件字典数据
     * @return
     */
    ResultDTO refreshZhimiFaultParts();

    /**
     * 查询指定时间录入的订单信息
     * @param startTime
     * @param endTime
     * @return
     */
    List<ZhimiOrderExtend> listOrdersByCreateTime(Date startTime, Date endTime);

    /**
     * 获取已申请的配件但还没有邮寄信息的订单
     * @return
     */
    List<ZhimiOrderExtend> listNoExpressOrders(Date startTime);

}
